package com.interviews.semaphore;

import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
import java.util.stream.IntStream;

/**
 * 信号量
 * 主要用于两个目的，一个是用于多个共享资源的互斥作用，另一个用于并发线程数的控制。
 *
 * @author qian
 * @version 1.0
 * @date 2022/2/22 17:08
 */
public class SemaphoreDemo {


    public static void main(String[] args) {
        Semaphore semaphore = new Semaphore(3);

        IntStream.range(1, 7).forEach(i -> new Thread(() -> {
            try {
                semaphore.acquire();
                System.out.println(Thread.currentThread().getName() + "\t抢到车位");
                try {
                    // 暂停秒
                    TimeUnit.SECONDS.sleep(3);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + "\t停车3秒后离开车位");
            } catch (InterruptedException e) {
                e.printStackTrace();
            } finally {
                semaphore.release();
            }
        },String.valueOf(i)).start());
    }
}
